在語句中常會出現概念相似的詞,包括某類物品、地名、時間...等。例如,輪椅、拐杖、助行器、電動床都屬於輔具實體;早上、中午、下午、傍晚屬於時間實體。將這些詞語對應到所屬的類別,可以使程式判斷使用者意圖時更貼近。
本研究使用 JSON 檔案紀錄詞語及其實體,並在程式完成斷詞後,將詞語一一對應到實體。需要增加實體時,可以直接修改檔案。
實體對應設定檔: https://gitlab.com/graduate_lab415/nlp/-/blob/master/docs/entities_config.json
完整程式在這邊: https://gitlab.com/graduate_lab415/nlp/-/blob/master/main.py
首先我在最上方的設計了一個變數,控制是否要為問句加上標籤。
"""
LABEL = True | False
default: True
"""
LABEL = True
接著程式會判斷本次製作模型,是否需要加標籤。若是,執行下方程式碼;若否跳過此段不執行。
"""use labeled or unlabeled"""
if LABEL:
label_conf = json.load(open("/home/yr/PycharmProjects/nlp/docs/entities_config.json", "r"))
docs_words_labeled = list()
for doc_words in docs_words:
doc_labeled = add_label(doc_words, label_conf)
docs_words = docs_words_labeled
open("檔案位址", "讀取模式")
是開啟前面我們設計好的設定檔。因為剛讀入的設定檔是純文字,因此接著使用 json.load()
將它轉成 json 格式。接下來使用迴圈為每一句問句加上標籤,並存入 docs_words_labeled
的 list 之中。
主要負責為句子加上標籤。
def add_label(doc,
label_config=json.load(open("/home/yr/PycharmProjects/nlp/docs/entities_config.json", "r"))):
"""labeling"""
doc_tmp = list()
for word in doc:
word_tmp = word
for entity_name in label_config:
if word in label_config[entity_name]:
word_tmp = entity_name
doc_tmp.append(word_tmp)
docs_words_labeled.append(doc_tmp)
if LOG:
print("before labeling:\t{}".format(doc))
print("after labeling:\t\t{}".format(doc_tmp))
return doc_tmp
先講參數部分
doc
: 要加標籤的句子label_config
: 標籤的設定檔。這邊是 Python 的一個特別的寫法,當沒有傳入參數時,直接使用預設值。昨天我們先斷過詞了,所以接下是把每詞拿出來和設定檔比對若有符合,就把詞的部分改成標籤。像是這樣:
Before: ["請問", "哪裡", "可以", "借", "輪椅"]
After: ["請問", "哪裡", "可以", "借", "<輔具>"]
如此一來,不管今天使用者想借的是什麼輔具,都可以對應到問題囉!